

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=auto>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/fluid.png">
  <link rel="icon" href="/img/fluid.png">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="author" content="John Doe">
  <meta name="keywords" content="">
  
    <meta name="description" content="@[toc] 一、ClickHouse 简介 ClickHouse 是 俄罗斯的 Yandex 公司于2016年开源的 列式存储数据库（DBMS），使用 C++语言 编写，主要用于在线分析处理查询（OLAP），能够使用 SQL 查询实时生成分析数据报告。 二、ClickHouse 特点 2.1 采用列式存储2.2 属于数据库管理系统（DBMS ）支持标准 SQL 的大部分语法，包括 DDL 数据定">
<meta property="og:type" content="article">
<meta property="og:title" content="ClickHouse 笔记1 _ 简介、特点 _ 基于CentOS7系统的安装与使用 _ 常用数据类型 _ MergeTree 表引擎 _ SQL操作">
<meta property="og:url" content="http://example.com/2022/07/26/ClickHouse%20%E7%AC%94%E8%AE%B01%20_%20%E7%AE%80%E4%BB%8B%E3%80%81%E7%89%B9%E7%82%B9%20_%20%E5%9F%BA%E4%BA%8ECentOS7%E7%B3%BB%E7%BB%9F%E7%9A%84%E5%AE%89%E8%A3%85%E4%B8%8E%E4%BD%BF%E7%94%A8%20_%20%E5%B8%B8%E7%94%A8%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%20_%20MergeTree%20%E8%A1%A8%E5%BC%95%E6%93%8E%20_%20SQL%E6%93%8D%E4%BD%9C/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="@[toc] 一、ClickHouse 简介 ClickHouse 是 俄罗斯的 Yandex 公司于2016年开源的 列式存储数据库（DBMS），使用 C++语言 编写，主要用于在线分析处理查询（OLAP），能够使用 SQL 查询实时生成分析数据报告。 二、ClickHouse 特点 2.1 采用列式存储2.2 属于数据库管理系统（DBMS ）支持标准 SQL 的大部分语法，包括 DDL 数据定">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://img-blog.csdnimg.cn/d3e68718151a4b84b3d3b5ad932643cd.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/72b781dd521f4e5fa481542e5b11445c.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/bc6c4085ab284e28af24a77714c12d5a.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/b641eccbd9a84d19a3fc98e6fb463da8.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/3ef5a4e1587041fd8f2debefaed3ff69.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/c6670ec9d8a04068ab4038d541147410.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/c2bd427b4ae0446b86a47d4bd811da60.png">
<meta property="og:image" content="https://img-blog.csdnimg.cn/img_convert/cc1aec6384c3f97959b4b464f808cfdc.jpeg">
<meta property="article:published_time" content="2022-07-26T07:28:37.000Z">
<meta property="article:modified_time" content="2022-08-22T15:42:50.741Z">
<meta property="article:author" content="John Doe">
<meta property="article:tag" content="ClickHouse">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://img-blog.csdnimg.cn/d3e68718151a4b84b3d3b5ad932643cd.png">
  
  
  
  <title>ClickHouse 笔记1 _ 简介、特点 _ 基于CentOS7系统的安装与使用 _ 常用数据类型 _ MergeTree 表引擎 _ SQL操作 - Hexo</title>

  <link  rel="stylesheet" href="https://lib.baomitu.com/twitter-bootstrap/4.6.1/css/bootstrap.min.css" />



  <link  rel="stylesheet" href="https://lib.baomitu.com/github-markdown-css/4.0.0/github-markdown.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/hint.css/2.7.0/hint.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.css" />



<!-- 主题依赖的图标库，不要自行修改 -->
<!-- Do not modify the link that theme dependent icons -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_hj8rtnfg7um.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_lbnruvf0jn.css">


<link  rel="stylesheet" href="/css/main.css" />


  <link id="highlight-css" rel="stylesheet" href="/css/highlight.css" />
  
    <link id="highlight-css-dark" rel="stylesheet" href="/css/highlight-dark.css" />
  




  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    Fluid.ctx = Object.assign({}, Fluid.ctx)
    var CONFIG = {"hostname":"example.com","root":"/","version":"1.9.2","typing":{"enable":true,"typeSpeed":70,"cursorChar":"_","loop":false,"scope":[]},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"left","visible":"hover","icon":""},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"code_language":{"enable":true,"default":"TEXT"},"copy_btn":true,"image_caption":{"enable":true},"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"placement":"right","headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":false,"follow_dnt":true,"baidu":null,"google":null,"gtag":null,"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"app_id":null,"app_key":null,"server_url":null,"path":"window.location.pathname","ignore_local":false}},"search_path":"/local-search.xml"};

    if (CONFIG.web_analytics.follow_dnt) {
      var dntVal = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
      Fluid.ctx.dnt = dntVal && (dntVal.startsWith('1') || dntVal.startsWith('yes') || dntVal.startsWith('on'));
    }
  </script>
  <script  src="/js/utils.js" ></script>
  <script  src="/js/color-schema.js" ></script>
  


  
<meta name="generator" content="Hexo 6.2.0"></head>


<body>
  

  <header>
    

<div class="header-inner" style="height: 70vh;">
  <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand" href="/">
      <strong>尤 Ni&#39;s Blog</strong>
    </a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/">
                <i class="iconfont icon-home-fill"></i>
                首页
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/">
                <i class="iconfont icon-archive-fill"></i>
                归档
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/">
                <i class="iconfont icon-category-fill"></i>
                分类
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/">
                <i class="iconfont icon-tags-fill"></i>
                标签
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/">
                <i class="iconfont icon-user-fill"></i>
                关于
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalSearch" aria-label="Search">
              &nbsp;<i class="iconfont icon-search"></i>&nbsp;
            </a>
          </li>
          
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self" href="javascript:;" aria-label="Color Toggle">&nbsp;<i
                class="iconfont icon-dark" id="color-toggle-icon"></i>&nbsp;</a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

  

<div id="banner" class="banner" parallax=true
     style="background: url('/img/default.png') no-repeat center center; background-size: cover;">
  <div class="full-bg-img">
    <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
      <div class="banner-text text-center fade-in-up">
        <div class="h2">
          
            <span id="subtitle" data-typed-text="ClickHouse 笔记1 _ 简介、特点 _ 基于CentOS7系统的安装与使用 _ 常用数据类型 _ MergeTree 表引擎 _ SQL操作"></span>
          
        </div>

        
          
  <div class="mt-3">
    
      <span class="post-meta mr-2">
        <i class="iconfont icon-author" aria-hidden="true"></i>
        John Doe
      </span>
    
    
      <span class="post-meta">
        <i class="iconfont icon-date-fill" aria-hidden="true"></i>
        <time datetime="2022-07-26 15:28" pubdate>
          2022年7月26日 下午
        </time>
      </span>
    
  </div>

  <div class="mt-1">
    
      <span class="post-meta mr-2">
        <i class="iconfont icon-chart"></i>
        
          16k 字
        
      </span>
    

    
      <span class="post-meta mr-2">
        <i class="iconfont icon-clock-fill"></i>
        
        
        
          137 分钟
        
      </span>
    

    
    
  </div>


        
      </div>

      
    </div>
  </div>
</div>

</div>

  </header>

  <main>
    
      

<div class="container-fluid nopadding-x">
  <div class="row nomargin-x">
    <div class="side-col d-none d-lg-block col-lg-2">
      

    </div>

    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div id="board">
          <article class="post-content mx-auto">
            <!-- SEO header -->
            <h1 style="display: none">ClickHouse 笔记1 _ 简介、特点 _ 基于CentOS7系统的安装与使用 _ 常用数据类型 _ MergeTree 表引擎 _ SQL操作</h1>
            
              <p class="note note-info">
                
                  
                    本文最后更新于：1 小时前
                  
                
              </p>
            
            
              <div class="markdown-body">
                
                <p>@[toc]</p>
<h1 id="一、ClickHouse-简介"><a href="#一、ClickHouse-简介" class="headerlink" title="一、ClickHouse 简介"></a>一、ClickHouse 简介</h1><hr>
<p>ClickHouse 是 俄罗斯的 Yandex 公司于2016年开源的 <strong>列式存储数据库</strong>（DBMS），使用 <strong>C++语言</strong> 编写，主要用于在线分析处理查询（OLAP），能够使用 SQL 查询实时生成分析数据报告。</p>
<h1 id="二、ClickHouse-特点"><a href="#二、ClickHouse-特点" class="headerlink" title="二、ClickHouse 特点"></a>二、ClickHouse 特点</h1><hr>
<h2 id="2-1-采用列式存储"><a href="#2-1-采用列式存储" class="headerlink" title="2.1 采用列式存储"></a>2.1 采用列式存储</h2><h2 id="2-2-属于数据库管理系统（DBMS-）"><a href="#2-2-属于数据库管理系统（DBMS-）" class="headerlink" title="2.2 属于数据库管理系统（DBMS ）"></a>2.2 属于数据库管理系统（DBMS ）</h2><p>支持标准 SQL 的大部分语法，包括 DDL 数据定义 和 DML 数据操纵，以及相关函数，用户管理以及权限管理，数据备份与恢复</p>
<h2 id="2-3-多样化引擎"><a href="#2-3-多样化引擎" class="headerlink" title="2.3 多样化引擎"></a>2.3 多样化引擎</h2><p>和 MySQL 类似，把表级的存储引擎插件化，根据表的不同需求可设置不同的存储引擎，目前有合并树、日志、接口和其他四大类的二十多种引擎。</p>
<h2 id="2-4-高吞吐写数据"><a href="#2-4-高吞吐写数据" class="headerlink" title="2.4 高吞吐写数据"></a>2.4 高吞吐写数据</h2><p>ClickHouse 采用类 日志结构合并树 LSM Tree(Log-Structured-Merge-Tree），数据写入后，定期在后台进行压缩（Compaction）</p>
<p>通过类 LSM Tree 的存储结构，ClickHouse 写数据是以追加（append）的方式，且写入后数据段不可更改。</p>
<p>在后台执行压缩（Compaction）时是多个段 归并（Merge）、排序（Sort）后按顺序写回磁盘。</p>
<p>顺序写的特性：有效利用磁盘的吞吐能力</p>
<h2 id="2-5-数据分区与线程级并行"><a href="#2-5-数据分区与线程级并行" class="headerlink" title="2.5 数据分区与线程级并行"></a>2.5 数据分区与线程级并行</h2><p>ClickHouse 将数据划分为多个 partition（分区），每个 partition 再划分为多个 index granularity（索引粒度），然后通过多个 CPU 核心分别处理其中的一部分，从而实现并行的数据处理</p>
<p>特点：单条 Query 查询语句就能利用整机的所有 CPU，并行处理降低了查询的延时。</p>
<p>不过这种并行方式使得 不便同时并发多条查询，，ClickHouse 并不擅长处理高qps（ 每秒查询率 &#x3D; 并发数&#x2F;平均响应时间）的查询业务</p>
<h1 id="三、Centos-下使用安装-ClickHouse"><a href="#三、Centos-下使用安装-ClickHouse" class="headerlink" title="三、Centos 下使用安装 ClickHouse"></a>三、Centos 下使用安装 ClickHouse</h1><hr>
<p>ClickHouse 可以在任何具有 x86_64、AArch64 或 PowerPC64LE CPU 架构的 Linux、FreeBSD 或 Mac OS X 上运行。<br>官方文档 快速入门：<a target="_blank" rel="noopener" href="https://clickhouse.com/docs/en/quick-start/">https://clickhouse.com/docs/en/quick-start/</a></p>
<h2 id="3-1-安装-clickhouse"><a href="#3-1-安装-clickhouse" class="headerlink" title="3.1 安装 clickhouse"></a>3.1 安装 clickhouse</h2><h3 id="3-1-1-方式一：使用-yum-安装"><a href="#3-1-1-方式一：使用-yum-安装" class="headerlink" title="3.1.1 方式一：使用 yum 安装"></a>3.1.1 方式一：使用 yum 安装</h3><p>ClickHouse官网：<a target="_blank" rel="noopener" href="https://clickhouse.com/docs/zh/getting-started/install">Fast Open-Source OLAP DBMS - ClickHouse</a><br>下载地址：<a target="_blank" rel="noopener" href="https://packages.clickhouse.com/rpm/stable/">https://packages.clickhouse.com/rpm/stable/</a></p>
<ul>
<li><strong>clickhouse-common-static</strong> — ClickHouse编译的二进制文件。</li>
<li><strong>clickhouse-server</strong> — 创建<strong>clickhouse-server</strong>软连接，并安装默认配置服务</li>
<li><strong>clickhouse-client</strong> — 创建<strong>clickhouse-client</strong>客户端工具软连接，并安装客户端配置文件。</li>
<li><strong>clickhouse-common-static-dbg</strong> — 带有调试信息的ClickHouse二进制文件。</li>
</ul>
<p>添加官方的库：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs shell">sudo yum install -y yum-utils<br>sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo<br><br></code></pre></td></tr></table></figure>
<p>下载</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">sudo yum install -y clickhouse-server clickhouse-client<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/30596ba885944e2bad9cfaaa3208b48e.png#">https://img-blog.csdnimg.cn/30596ba885944e2bad9cfaaa3208b48e.png#</a> &#x3D;50%x)</p>
<h3 id="3-2-2-方式二：使用-Docker-拉取镜像"><a href="#3-2-2-方式二：使用-Docker-拉取镜像" class="headerlink" title="3.2.2 方式二：使用 Docker 拉取镜像"></a>3.2.2 方式二：使用 Docker 拉取镜像</h3><p>我这里的 Docker 是本机虚拟机里配置的 Docker</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><code class="hljs shell"><span class="hljs-meta prompt_"># </span><span class="language-bash">启动 docker</span><br>sudo systemctl start docker<br><span class="hljs-meta prompt_"></span><br><span class="hljs-meta prompt_"># </span><span class="language-bash">创建容器</span><br>sudo docker run --name c1 -d -it -p 8181:8181 clickhouse/clickhouse-server<br></code></pre></td></tr></table></figure>

<p>查看容器 IP</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs java">docker inspect -f <span class="hljs-string">&#x27;&#123;&#123;range .NetworkSettings.Networks&#125;&#125;&#123;&#123;.IPAddress&#125;&#125;&#123;&#123;end&#125;&#125;&#x27;</span> c1<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/0b53de3d1d2a49688e9294eeca9e14da.png#">https://img-blog.csdnimg.cn/0b53de3d1d2a49688e9294eeca9e14da.png#</a> &#x3D;50%x)</p>
<p>设置宿主机到虚拟机里Docker容器的端口映射，保证能ping通，这里可参考：<br><a target="_blank" rel="noopener" href="https://blog.csdn.net/Unirithe/article/details/120711045">https://blog.csdn.net/Unirithe/article/details/120711045</a><br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/0e81bf508f704e3bac40ecc5a59710ec.png#">https://img-blog.csdnimg.cn/0e81bf508f704e3bac40ecc5a59710ec.png#</a> &#x3D;50%x)</p>
<p>使用 Docker 的话就无需配置和启动了，只要容器在运行，ClickHouse 服务就默认启动了，比如访问：<a target="_blank" rel="noopener" href="http://172.17.0.2:8123/">http://172.17.0.2:8123/</a>，会有一个 Ok.的结果<br><img src="https://img-blog.csdnimg.cn/d3e68718151a4b84b3d3b5ad932643cd.png" srcset="/img/loading.gif" lazyload alt="在这里插入图片描述"></p>
<h2 id="3-2-配置-ClickHouse"><a href="#3-2-配置-ClickHouse" class="headerlink" title="3.2 配置 ClickHouse"></a>3.2 配置 ClickHouse</h2><p>Click House 官方默认是关闭外部连接的，需手动配置</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs shell">sudo vim /etc/clickhouse-server/config.xml<br><span class="hljs-meta prompt_"></span><br><span class="hljs-meta prompt_"># </span><span class="language-bash">在 vim 查询 &lt;lisen_host&gt;::&lt;/listen_host&gt;</span><br>/&lt;listen_host&gt;::&lt;/listen_host&gt;<br></code></pre></td></tr></table></figure>

<p>把 <listen_host>::</listen_host> 的注释打开后保存<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/e51937e167f84f5e833565be8c3fbfa5.png#">https://img-blog.csdnimg.cn/e51937e167f84f5e833565be8c3fbfa5.png#</a> &#x3D;50%x)</p>
<p>除了打开 <listen_host> 配置，我们需要了解其默认配置的数据文件和日志文件的存储路径，也可以根据自己需要修改默认的位置。</p>
<ul>
<li>默认数据文件配置 <path>&#x2F;var&#x2F;lib&#x2F;clickhouse&#x2F;</path></li>
<li>日志文件配置 <log>&#x2F;var&#x2F;log&#x2F;clickhouse-server&#x2F;clickhouse-server.log</log></li>
</ul>
<h2 id="3-3-启动-Click-House"><a href="#3-3-启动-Click-House" class="headerlink" title="3.3 启动 Click House"></a>3.3 启动 Click House</h2><p>查看 clickhouse-server 的安装目录</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">rpm -ql clickhouse-server.x86_64<br></code></pre></td></tr></table></figure>
<p>启动 clickhouse</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">sudo /etc/init.d/clickhouse-server start<br></code></pre></td></tr></table></figure>
<h2 id="3-4-测试连接"><a href="#3-4-测试连接" class="headerlink" title="3.4 测试连接"></a>3.4 测试连接</h2><p>在之前的依赖包中，我们同时也安装了 Click House 的客户端，接下来使用客户端的命令连接启动的服务端，查看一下是否能正常连接，如果是通过方式一安装的 clickhouse（都安装在Linux），则执行</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">clickhouse-client -m<br></code></pre></td></tr></table></figure>

<p>如果是通过 Docker 安装的，这里我采用的是 Docker放 Click House 服务端，而 Docker宿主机就放 Click Client 客户端进行连接，则执行下面命令，指定容器的IP即可：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">clickhouse-client -h 172.17.0.2 -m<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/b3d222ee05b94a389a9684bc830afc35.png#">https://img-blog.csdnimg.cn/b3d222ee05b94a389a9684bc830afc35.png#</a> &#x3D;50%x)</p>
<p>测试命令，查询所有的数据库：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">:) show databases<br></code></pre></td></tr></table></figure>

<p>方式一安装下测试成功的结果如下图：<br><img src="https://img-blog.csdnimg.cn/72b781dd521f4e5fa481542e5b11445c.png" srcset="/img/loading.gif" lazyload alt="在这里插入图片描述"></p>
<h1 id="四、数据类型"><a href="#四、数据类型" class="headerlink" title="四、数据类型"></a>四、数据类型</h1><hr>
<p>官方文档：<a target="_blank" rel="noopener" href="https://clickhouse.com/docs/en/sql-reference/data-types/">https://clickhouse.com/docs/en/sql-reference/data-types/</a></p>
<h2 id="4-1-整型"><a href="#4-1-整型" class="headerlink" title="4.1 整型"></a>4.1 整型</h2><p>固定长度，分为有符号和无符号</p>
<p><strong>有符号整型</strong></p>
<p>取值范围：[$-2^n$ ~ $2^{n-1} - 1$]</p>
<table>
<thead>
<tr>
<th align="left">类型</th>
<th align="left">数据范围</th>
</tr>
</thead>
<tbody><tr>
<td align="left">Int8</td>
<td align="left">-128 ~ 127</td>
</tr>
<tr>
<td align="left">Int16</td>
<td align="left">-32768 ~ 32767</td>
</tr>
<tr>
<td align="left">Int32</td>
<td align="left">-2147483648 ~ 2147483647</td>
</tr>
<tr>
<td align="left">int64</td>
<td align="left">-9223372036854775808~9223372036854775807</td>
</tr>
</tbody></table>
<p><strong>无符号整型</strong></p>
<p>取值范围：[$0$~ $2^n - 1$]</p>
<table>
<thead>
<tr>
<th align="left">类型</th>
<th align="left">数据范围</th>
</tr>
</thead>
<tbody><tr>
<td align="left">UInt8</td>
<td align="left">0~255</td>
</tr>
<tr>
<td align="left">UInt16</td>
<td align="left">0~65535</td>
</tr>
<tr>
<td align="left">UInt32</td>
<td align="left">0 ~ 4294967295</td>
</tr>
<tr>
<td align="left">Uint64</td>
<td align="left">0 ~18446744073709551615</td>
</tr>
</tbody></table>
<p>使用场景：记录个数、数量、存储型 id 等</p>
<h2 id="4-2-浮点型"><a href="#4-2-浮点型" class="headerlink" title="4.2 浮点型"></a>4.2 浮点型</h2><p>浮点型有 Float32 和 Float64 两种，类似 Java 里的  float 和 double</p>
<p>建议：尽量用整数存储数据，例，将固定精度的数字转为整数值，如时间用毫秒为单位表示，因为浮点型计算可能会出现误差，例如在 ClickHouse中计算 1.0 - 0.9 ，结果是 0.0999… 趋近于0.1， 而不是 0.1<br><img src="https://img-blog.csdnimg.cn/bc6c4085ab284e28af24a77714c12d5a.png" srcset="/img/loading.gif" lazyload alt="在这里插入图片描述"></p>
<p>使用场景：数据值较小，不涉及大量统计计算，且精度要求不高时，如保存商品的重量。</p>
<h2 id="4-3-无布尔型"><a href="#4-3-无布尔型" class="headerlink" title="4.3 无布尔型"></a>4.3 无布尔型</h2><p>Click House 没有提供 bool 类型 ，一般可使用 UInt8 类型来表示， 取值限制为 0 或1 即可</p>
<h2 id="4-4-Decimal-类型"><a href="#4-4-Decimal-类型" class="headerlink" title="4.4 Decimal 类型"></a>4.4 Decimal 类型</h2><p>Decimal 为有符号的浮点数，在加减乘运算中保持精度，而在触发中，最低有效数字会被舍去。<br>声明：</p>
<ul>
<li>Decimal32(s)，相当于 Decimal(9-s,  s) ，小数有效位在 1 ~ 9 之间</li>
<li>Decimal64(s)，相当于 Decimal(18-s,  s) ，小数有效位在 1 ~18 之间</li>
<li>Decimal128(s)，相当于 Decimal(38-s,  s) ，小数有效位在 1 ~38 之间</li>
</ul>
<p>（其中的 s 表示小数位）<br>使用场景：金额字段、汇率、利率等字段，为保证小数点精度，都使用 Decimal 存储</p>
<h2 id="4-5-字符串"><a href="#4-5-字符串" class="headerlink" title="4.5 字符串"></a>4.5 字符串</h2><p> Click House 中的字符串分为两种，String 和 FixedString(N)</p>
<ul>
<li><strong>String</strong></li>
</ul>
<p>字符串可任意长，包含任意的字节集，包括空的字节</p>
<ul>
<li><strong>FixedString(N)</strong></li>
</ul>
<p>固定长度 N 的字符串，N 必须是严格的正整数。<br>类似于 MySQL里的 varchar<br>使用场景：名称、文字描述、字符型编码，该类型不常用</p>
<h2 id="4-6-枚举"><a href="#4-6-枚举" class="headerlink" title="4.6 枚举"></a>4.6 枚举</h2><p>枚举类型分为 Enum8 和 Enum16 这两种，Enum枚举存储的是 ‘string’ &#x3D; integer 的对应关系。 Enum8 用 ‘String’ &#x3D;Int8 对描述，Enum16用‘String’ &#x3D; Int16 对描述</p>
<p><strong>使用示例：</strong></p>
<ol>
<li><p>创建一个表 t_enum并带有枚举 Enum8 (‘hello’ &#x3D; 1, ‘world’ &#x3D; 2) 类型的列 ，引擎暂时用 TinyLog</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> t_enum(<br>  x Enum8(<span class="hljs-string">&#x27;hello&#x27;</span> <span class="hljs-operator">=</span> <span class="hljs-number">1</span>, <span class="hljs-string">&#x27;world&#x27;</span> <span class="hljs-operator">=</span> <span class="hljs-number">2</span>)<br> ) ENGINE <span class="hljs-operator">=</span> TinyLog;<br></code></pre></td></tr></table></figure>
<p>这个 x 列 只能存储类型定义中取出的值，’hello’ 或 ‘world’</p>
</li>
<li><p>插入枚举类型支持的数据</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs plsql">INSERT INTO t_enum VALUES (&#x27;hello&#x27;), (&#x27;world&#x27;), (&#x27;hello&#x27;);<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询表数据</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_enum;<br></code></pre></td></tr></table></figure>
<p>运行结果：<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/dd79db2182f5421c87bdb755c7fa3aa9.png#">https://img-blog.csdnimg.cn/dd79db2182f5421c87bdb755c7fa3aa9.png#</a> &#x3D;50%x)</p>
</li>
<li><p>尝试插入其他的值，结果报错</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> t_enum <span class="hljs-keyword">VALUES</span> (<span class="hljs-string">&#x27;uni&#x27;</span>);<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/776e61afc6184d58a75a9a431ff7bc16.png#">https://img-blog.csdnimg.cn/776e61afc6184d58a75a9a431ff7bc16.png#</a> &#x3D;50%x)</p>
</li>
<li><p>查看对应枚举行的数值，需将 Enum 的值转换为 整数类型</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> <span class="hljs-built_in">cast</span>(x, <span class="hljs-string">&#x27;Int8&#x27;</span>) <span class="hljs-keyword">from</span> t_enum;<br></code></pre></td></tr></table></figure>
<p>运行结果：<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/c8a9187327fa4587bb3dd10be01c5cbe.png#">https://img-blog.csdnimg.cn/c8a9187327fa4587bb3dd10be01c5cbe.png#</a> &#x3D;50%x)</p>
</li>
</ol>
<p>使用场景：对表示状态、类型的字段是一种空间优化与数据约束，数据几乎不发生变换时可以使用。</p>
<h2 id="4-7-时间类型"><a href="#4-7-时间类型" class="headerlink" title="4.7 时间类型"></a>4.7 时间类型</h2><p>目前 ClickHouse 支持三种时间类型，分别是 Date32、Datetime 和 Datetime64</p>
<ul>
<li>Date32 存储 [年-月-日] 的字符串，如 ‘2022-07-22’</li>
<li>Datetime存储 [年-月-日 时:分:秒] 的字符串，如 ‘2022-07-22 14:45:00’</li>
<li>Datetime64 存储 [年-月-日 时:分:秒.亚秒] 的字符串，如 ‘2022-07-22 14:45:00. 66’</li>
</ul>
<p>日期类型，用两个字节存储，表示从 1970-01-01 （无符号）到当前的日期值</p>
<h2 id="4-8-数组"><a href="#4-8-数组" class="headerlink" title="4.8 数组"></a>4.8 数组</h2><p>Array(T)：由 T 类型元素组成的数组<br>T 可以是任意类型，包含数组类型（支持嵌套）。但不推荐使用多维数组，Click House 对多维数组的支持有限，例：不能在 MergeTree 表中存储多维数组</p>
<p>使用示例：</p>
<ol>
<li><p>使用 array 函数创建数组</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> <span class="hljs-keyword">array</span>(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>) <span class="hljs-keyword">as</span> x, toTypeName(x);<br></code></pre></td></tr></table></figure>
<p>运行结果：<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/3623e24f03044081b7333cc9518ef9cf.png#">https://img-blog.csdnimg.cn/3623e24f03044081b7333cc9518ef9cf.png#</a> &#x3D;50%x)</p>
</li>
<li><p>示例1的另一种表达方式，使用方括号表示数组</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>] <span class="hljs-keyword">as</span> x, toTypeName(x);<br></code></pre></td></tr></table></figure>
<p>运行结果：<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/4cce049737f14025af1fe41371e82dcf.png#">https://img-blog.csdnimg.cn/4cce049737f14025af1fe41371e82dcf.png#</a> &#x3D;50%x)</p>
</li>
</ol>
<h1 id="五、Click-House-表引擎"><a href="#五、Click-House-表引擎" class="headerlink" title="五、Click House 表引擎"></a>五、Click House 表引擎</h1><hr>
<p>表引擎是 ClickHouse 的特点，它决定了如何存储表的数据，除此之外还有特点：</p>
<ul>
<li>数据的存储方式和位置，写到哪里以及从哪里读取数据</li>
<li>支持哪些查询以及如何支持</li>
<li>并发数据访问</li>
<li>有的引擎支持索引</li>
<li>是否可以执行多线程请求</li>
<li>数据复制参数</li>
</ul>
<p>表引擎的使用方式就是必须显式地在创建表时定义该表使用的引擎，以及引擎相关的参数。<br>注：Click House的引擎名称大小写敏感</p>
<h2 id="5-1-TinyLog-引擎"><a href="#5-1-TinyLog-引擎" class="headerlink" title="5.1 TinyLog 引擎"></a>5.1 TinyLog 引擎</h2><p>TinyLog 引擎支持以列文件的形式保存在磁盘上，但是不支持索引，且没有并发控制。一般保存少量数据的小表，适合平时测试，不适合生产环境，如：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_tinylog(id String, name String) engine <span class="hljs-operator">=</span> TinyLog;<br></code></pre></td></tr></table></figure>
<h2 id="5-2-Memory-引擎"><a href="#5-2-Memory-引擎" class="headerlink" title="5.2 Memory 引擎"></a>5.2 Memory 引擎</h2><p>Memory 引擎属于内存引擎，数据以 <strong>未压缩</strong> 的原始形式直接保存在内存，只要服务器存储，数据就会消失。读写操作不会相互阻塞，不支持索引。<br>简单查询的性能很高（超过 10G&#x2F;s）<br>平时运用得不多，同样是适合测试，还有需要高性能的场合。</p>
<h2 id="5-3-Merge-Tree-引擎"><a href="#5-3-Merge-Tree-引擎" class="headerlink" title="5.3 Merge Tree 引擎"></a>5.3 Merge Tree 引擎</h2><p>官方参考文档：<a target="_blank" rel="noopener" href="https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/">https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/</a><br>Merge Tree 归并树引擎是 ClickHouse 中 **最强大 **的表引擎之一，包括其拓展的其他 MegeTree，如下图：<br><img src="https://img-blog.csdnimg.cn/b641eccbd9a84d19a3fc98e6fb463da8.png" srcset="/img/loading.gif" lazyload alt="在这里插入图片描述"></p>
<p>该类引擎都支持索引和分区，地位相当于 MySQL 里的 innodb 引擎。</p>
<p>【应用案例】</p>
<ol>
<li><p>创建使用 MergeTree 引擎的数据表</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_order_mt(<br>  id UInt32,<br>  sku_id String,<br>  total_amount <span class="hljs-type">Decimal</span>(<span class="hljs-number">16</span>,<span class="hljs-number">2</span>),<br>  create_time Datetime<br>)<br>engine <span class="hljs-operator">=</span> MergeTree() <br><span class="hljs-keyword">PARTITION</span> <span class="hljs-keyword">BY</span> toYYYYMMDD(create_time) <br><span class="hljs-keyword">PRIMARY</span> KEY (id) <br><span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span>(id, sku_id);<br></code></pre></td></tr></table></figure>
</li>
<li><p>插入数据</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> t_order_mt <span class="hljs-keyword">values</span><br>(<span class="hljs-number">101</span>,<span class="hljs-string">&#x27;sku_001&#x27;</span>,<span class="hljs-number">1000.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>) ,<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 11:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_004&#x27;</span>,<span class="hljs-number">2500.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">12000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">600.00</span>,<span class="hljs-string">&#x27;2020-06-02 12:00:00&#x27;</span>);<br></code></pre></td></tr></table></figure>
</li>
<li><p>查询数据</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_order_mt;<br></code></pre></td></tr></table></figure>
<p>运行结果：<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/9b937e3072dd491daf88c0e471d169c8.png#">https://img-blog.csdnimg.cn/9b937e3072dd491daf88c0e471d169c8.png#</a> &#x3D;50%x)</p>
</li>
</ol>
<h3 id="5-3-1-partition-by-分区（可选）"><a href="#5-3-1-partition-by-分区（可选）" class="headerlink" title="5.3.1 partition by 分区（可选）"></a>5.3.1 partition by 分区（可选）</h3><p>partition by 分区的作用是：降低扫描的范围，优化查询速度</p>
<p>分区的特点：</p>
<ul>
<li>若创建表时不指定分区，那么就默认为一个分区</li>
<li>MergeTree 引擎是以 列文件 + 索引文件 + 表定义文件组成的，但如果设定了分区，那么这些文件就会保存到不同的分区目录中</li>
<li>支持并行，分区后，面对涉及跨分区的查询统计， ClickHouse 会以分区为单位并行处理</li>
<li>数据写入的分区合并，任何一个批次的数据写入都会产生一个 **临时 **的分区，不会纳入任何一个已有的分区。然后在写后的某个时刻（大概10~15 分钟后）ClickHouse 会自动执行合并操作，除了自动合并以外，可通过 optimize 命令提前进行合并，把临时分区的数据合并到已存在的分区：<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql">optimize <span class="hljs-keyword">table</span> xxx <span class="hljs-keyword">final</span>;<br></code></pre></td></tr></table></figure>
【应用案例】基于 Merge Tree 引擎中应用案例的表，接下来再插入一些数据，插入后立马查询<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> t_order_mt <span class="hljs-keyword">values</span><br>(<span class="hljs-number">101</span>,<span class="hljs-string">&#x27;sku_001&#x27;</span>,<span class="hljs-number">1000.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>) ,<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 11:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_004&#x27;</span>,<span class="hljs-number">2500.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">12000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">600.00</span>,<span class="hljs-string">&#x27;2020-06-02 12:00:00&#x27;</span>);<br><br><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_order_mt;<br></code></pre></td></tr></table></figure>
运行结果：<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/66175da64c1841af881e1807472f33a7.png#">https://img-blog.csdnimg.cn/66175da64c1841af881e1807472f33a7.png#</a> &#x3D;50%x)</li>
</ul>
<p>根据结果可以看出，当前这些数据没有纳入分区，结果中的一个表格相当于一个分区，接下来手动进行 optimize 操作，然后再次查询：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql">optimize <span class="hljs-keyword">table</span> t_order_mt <span class="hljs-keyword">final</span>;<br><br><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_order_mt;<br></code></pre></td></tr></table></figure>
<p>运行结果：<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/5072ca89c25b4b65abd02d30977b15c5.png#">https://img-blog.csdnimg.cn/5072ca89c25b4b65abd02d30977b15c5.png#</a> &#x3D;50%x)</p>
<p>可以看到在执行 optimize 后之前的临时分区现在已经合并进去了，之前创建表时设置的分区字段是create_time。</p>
<h3 id="5-3-2-primary-key-主键（可选）"><a href="#5-3-2-primary-key-主键（可选）" class="headerlink" title="5.3.2 primary key 主键（可选）"></a>5.3.2 primary key 主键（可选）</h3><p>ClickHouse 的主键，和其他数据库不太一样，只提供了数据的一级索引，但是却不是唯一约束，即 ClickHouse 数据表里可存在相同的 primary key 的数据<br>对于 ClickHouse 数据表主键的设定，其主要依据是查询语句中的 where 条件，根据条件通过对主键进行某种形式的二分查找，能够定位到对应的 index granularity（索引的粒度），避免全表扫描。</p>
<blockquote>
<p>index granularity 索引粒度是指在** sparse index（稀疏索引） **中两个相邻索引对应数据的间隔。<br>Click House 中 MergeTree 索引粒度默认是 8192 。除非列存在大量重复值，比如几万行才有一个不同数据，不然不建议修改，参考官方介绍 ：<a target="_blank" rel="noopener" href="https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/mergetree">https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/mergetree</a></p>
</blockquote>
<p>稀疏索引（图片转自 <a target="_blank" rel="noopener" href="https://baijiahao.baidu.com/s?id=1694065350596413101&wfr=spider&for=pc">https://baijiahao.baidu.com/s?id=1694065350596413101&wfr=spider&for=pc</a>）：<br><img src="https://img-blog.csdnimg.cn/3ef5a4e1587041fd8f2debefaed3ff69.png" srcset="/img/loading.gif" lazyload alt="在这里插入图片描述"></p>
<p>稀疏索引的好处是可以用较少的索引数据来定位更多的数据，不过只能定位到索引粒度的第一行，然后在进行顺序扫描。</p>
<h3 id="5-3-3-order-by-（必选"><a href="#5-3-3-order-by-（必选" class="headerlink" title="5.3.3 order by （必选)"></a>5.3.3 order by （必选)</h3><p>在创建表中指定 MergeTree 引擎时，order by 是必须要设置的，它设定了分区内的数据按照哪个&#x2F; 哪些字段顺序进行有序保存。<br>order by 是 Merge Tree 中唯一的一个必填项，甚至比 primary key 还重要，因为当用户不设置主键时，很多处理会按照 order by 的字段进行处理。</p>
<p>注:  primary key 主键 必须是 order by 字段的前缀或者相同<br>如：order by 字段是 (id, sku_id），那么主键必须是 id 或 (id, sku_id)</p>
<h3 id="5-3-4-二级索引"><a href="#5-3-4-二级索引" class="headerlink" title="5.3.4 二级索引"></a>5.3.4 二级索引</h3><p>【应用案例】<br>创建支持二级索引的数据表</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_order_mt2(<br>  id UInt32,<br>  sku_id String,<br>  total_amount <span class="hljs-type">Decimal</span>(<span class="hljs-number">16</span>,<span class="hljs-number">2</span>),<br>  create_time Datetime,<br>  INDEX a total_amount TYPE minmax GRANULARITY <span class="hljs-number">5</span><br>) engine <span class="hljs-operator">=</span>MergeTree<br><span class="hljs-keyword">partition</span> <span class="hljs-keyword">by</span> toYYYYMMDD(create_time)<br><span class="hljs-keyword">primary</span> key (id)<br><span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> (id, sku_id);<br></code></pre></td></tr></table></figure>
<p>其中 GRANULARITY 是设定二级索引对于一级索引粒度的粒度</p>
<p>插入数据</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> t_order_mt2 <span class="hljs-keyword">values</span><br>(<span class="hljs-number">101</span>,<span class="hljs-string">&#x27;sku_001&#x27;</span>,<span class="hljs-number">1000.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>) ,<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 11:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_004&#x27;</span>,<span class="hljs-number">2500.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">12000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">600.00</span>,<span class="hljs-string">&#x27;2020-06-02 12:00:00&#x27;</span>);<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/21db8b4b73f34fb39d6089f6108e2f2c.png#">https://img-blog.csdnimg.cn/21db8b4b73f34fb39d6089f6108e2f2c.png#</a> &#x3D;50%x)</p>
<p>ClickHouse 支持使用 clickhouse-client 启动客户端的命令来连接服务端并执行 sql 语句，例如：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"> clickhouse<span class="hljs-operator">-</span>client <span class="hljs-comment">--send_logs_level=trace &lt;&lt;&lt; &#x27;select </span><br><span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_order_mt2 <span class="hljs-keyword">where</span> total_amount <span class="hljs-operator">&gt;</span> toDecimal32(<span class="hljs-number">900.</span>, <span class="hljs-number">2</span>)<span class="hljs-string">&#x27;;</span><br></code></pre></td></tr></table></figure>

<p>运行结果：<br><img src="https://img-blog.csdnimg.cn/c6670ec9d8a04068ab4038d541147410.png" srcset="/img/loading.gif" lazyload alt="在这里插入图片描述"></p>
<h3 id="5-3-5-数据-TTL"><a href="#5-3-5-数据-TTL" class="headerlink" title="5.3.5 数据 TTL"></a>5.3.5 数据 TTL</h3><p>TTL 即 Time To Live，MergeTree 提供了可以管理数据表或者列的 **生命周期 **的功能。<br><strong>1）列级别 TTL</strong><br>比如在创建表时给某一列设置 TTL，这里给 total_amount  字段设置  TTL create_time+interval 10 SECOND</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_order_mt3(<br> id UInt32,<br> sku_id String,<br> total_amount <span class="hljs-type">Decimal</span>(<span class="hljs-number">16</span>,<span class="hljs-number">2</span>) TTL create_time<span class="hljs-operator">+</span><span class="hljs-type">interval</span> <span class="hljs-number">10</span> <span class="hljs-keyword">SECOND</span>,<br> create_time Datetime <br>) engine <span class="hljs-operator">=</span>MergeTree<br><span class="hljs-keyword">partition</span> <span class="hljs-keyword">by</span> toYYYYMMDD(create_time)<br><span class="hljs-keyword">primary</span> key (id)<br><span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> (id, sku_id);<br></code></pre></td></tr></table></figure>
<p>插入数据后立马查询</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> t_order_mt3 <span class="hljs-keyword">values</span><br>(<span class="hljs-number">106</span>,<span class="hljs-string">&#x27;sku_001&#x27;</span>,<span class="hljs-number">1000.00</span>,now()),<br>(<span class="hljs-number">107</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,now()),<br>(<span class="hljs-number">110</span>,<span class="hljs-string">&#x27;sku_003&#x27;</span>,<span class="hljs-number">600.00</span>,now());<br><br><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_order_mt3;<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/e1efa24a8a74459c9ec94fba3b12020d.png#">https://img-blog.csdnimg.cn/e1efa24a8a74459c9ec94fba3b12020d.png#</a> &#x3D;50%x)</p>
<p>过十秒后再次查询，total_amount 列的值全变成了0<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/4495dda9fa2a40b7807a98939ca5cd74.png#">https://img-blog.csdnimg.cn/4495dda9fa2a40b7807a98939ca5cd74.png#</a> &#x3D;50%x)</p>
<p><strong>2）表级别 TTL</strong><br>以下面这条语句为例，设置表在 create_time 之后 10秒丢失</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">alter</span> <span class="hljs-keyword">table</span> t_order_mt3 modify ttl create_time <span class="hljs-type">interval</span> <span class="hljs-number">10</span> secend;<br></code></pre></td></tr></table></figure>
<p>相关字段必须是 Date 或 DateTime类型，推荐使用分区的日期字段<br>能使用的时间周期有：</p>
<ul>
<li>SECOND</li>
<li>MINUTE</li>
<li>HOUR</li>
<li>DAY</li>
<li>WEEK</li>
<li>MONTH</li>
<li>QUARTER</li>
<li>YEAR</li>
</ul>
<h2 id="5-4-ReplacingMergeTree-引擎"><a href="#5-4-ReplacingMergeTree-引擎" class="headerlink" title="5.4 ReplacingMergeTree 引擎"></a>5.4 ReplacingMergeTree 引擎</h2><p>ReplacingMergeTree 是 MergeTree的一个升级版，其存储特性完全继承 MergeTree，不过多了个去重功能，由于在 MergeTree中可以设置主键，但主键没有唯一约束的功能，所以当想处理掉重复的数据时，可以使用 ReplacingMergeTree引擎</p>
<p>1）去重机制<br>数据去重只会在合并的过程中出现。合并会做未知的时间在后台进行，所以无法预先做出计划。因为有些数据可能仍然没有被处理<br>2）去重范围<br>若表经过了分区，去重只会在 **分区内部 **进行去重，不能执行跨分区的去重。<br>故 ReplacingMergeTree 使用于在后台清除重复的数据以节省空间，但不能保证一定没有重复的数据出现。<br>【应用案例】 创建根据 create_time 字段为版本号的 RMT 引擎表</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_order_rmt(<br>  id UInt32,<br>  sku_id String,<br>  total_amount <span class="hljs-type">Decimal</span>(<span class="hljs-number">16</span>,<span class="hljs-number">2</span>) ,<br>  create_time Datetime <br>) engine <span class="hljs-operator">=</span>ReplacingMergeTree(create_time)<br> <span class="hljs-keyword">partition</span> <span class="hljs-keyword">by</span> toYYYYMMDD(create_time)<br> <span class="hljs-keyword">primary</span> key (id)<br> <span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> (id, sku_id);<br> <br> <span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> t_order_rmt <span class="hljs-keyword">values</span><br>(<span class="hljs-number">101</span>,<span class="hljs-string">&#x27;sku_001&#x27;</span>,<span class="hljs-number">1000.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>) ,<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 11:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_004&#x27;</span>,<span class="hljs-number">2500.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">12000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">600.00</span>,<span class="hljs-string">&#x27;2020-06-02 12:00:00&#x27;</span>);<br></code></pre></td></tr></table></figure>
<p>注：ReplacingMergeTree括号内填入的参数为版本字段，当出现重复数据时，会保留最大的版本字段的所在行，若不填，则默认按照插入顺序保留最后一条，即支持覆盖。</p>
<p>第一次查询数据：</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_order_rmt;<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/65190c38f3ef46b0bc7b821cd65401b4.png#">https://img-blog.csdnimg.cn/65190c38f3ef46b0bc7b821cd65401b4.png#</a> &#x3D;50%x)</p>
<p>手动合并后再次查询</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql">OPTIMIZE <span class="hljs-keyword">TABLE</span> t_order_rmt <span class="hljs-keyword">FINAL</span>;<br><br><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_order_rmt;<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/9a657a4f42a54282a69487144c0b5b33.png#">https://img-blog.csdnimg.cn/9a657a4f42a54282a69487144c0b5b33.png#</a> &#x3D;50%x)</p>
<p>结论：</p>
<ul>
<li>RMT引擎实际使用了 order by 字段作为唯一的键</li>
<li>去重无法跨分区</li>
<li>只有同一批插入或合并分区时才会去重</li>
<li>认定重复的数据保留，版本字段值最大的</li>
<li>若版本字段相同，则按插入顺序保留最后一行</li>
</ul>
<h2 id="5-5-SummingMergeTreee-引擎"><a href="#5-5-SummingMergeTreee-引擎" class="headerlink" title="5.5 SummingMergeTreee 引擎"></a>5.5 SummingMergeTreee 引擎</h2><p>对于不查询明细，只关心维度进行汇总聚合结果都场景。若只使用普通的 MergeTree，无论是存储空间的开销，还是查询时临时聚合的开销，都会比较大<br>ClickHouse为了这种场景，提供了一种能“预聚合”的引擎 SummingMergeTree<br>【应用案例】创建 使用 SummingMergeTreee  引擎的表</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_order_smt(<br> id UInt32,<br> sku_id String,<br> total_amount <span class="hljs-type">Decimal</span>(<span class="hljs-number">16</span>,<span class="hljs-number">2</span>) ,<br> create_time Datetime <br>) engine <span class="hljs-operator">=</span>SummingMergeTree(total_amount)<br> <span class="hljs-keyword">partition</span> <span class="hljs-keyword">by</span> toYYYYMMDD(create_time)<br> <span class="hljs-keyword">primary</span> key (id)<br> <span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> (id,sku_id );<br> <br> <span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> t_order_smt <span class="hljs-keyword">values</span><br>(<span class="hljs-number">101</span>,<span class="hljs-string">&#x27;sku_001&#x27;</span>,<span class="hljs-number">1000.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 11:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_004&#x27;</span>,<span class="hljs-number">2500.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">12000.00</span>,<span class="hljs-string">&#x27;2020-06-01 13:00:00&#x27;</span>),<br>(<span class="hljs-number">102</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">600.00</span>,<span class="hljs-string">&#x27;2020-06-02 12:00:00&#x27;</span>);<br><br> <span class="hljs-keyword">select</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_order_smt;<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/290b015ccf0642c4b67370b92399e322.png#">https://img-blog.csdnimg.cn/290b015ccf0642c4b67370b92399e322.png#</a> &#x3D;50%x)</p>
<p>合并后再次查询</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs sql">OPTIMIZE <span class="hljs-keyword">TABLE</span> t_order_smt <span class="hljs-keyword">FINAL</span>;<br><br><span class="hljs-keyword">select</span> <span class="hljs-operator">*</span> <span class="hljs-keyword">from</span> t_order_smt;<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/f5c85f112d2d4871bcf0b20045005eae.png#">https://img-blog.csdnimg.cn/f5c85f112d2d4871bcf0b20045005eae.png#</a> &#x3D;50%x)</p>
<p>结论：</p>
<ul>
<li>以 SummingMergeTree () 中指定的列为汇总数据列</li>
<li>可以填写多列，必须是数字列，若不填写，以所有非维度列且为数字列的字段为汇总数据列</li>
<li>以 order by 的列为准，作为维度列</li>
<li>其他的列按插入顺序保留第一行</li>
<li>不在一个分区的数据不会被聚合</li>
<li>只有在同一批次插入（新版本）或 分片合并时才会进行聚合<blockquote>
<p>开发建议<br>设计聚合表，唯一键值、流水号可以去掉，所有字段全部是维度、度量或时间戳</p>
</blockquote>
</li>
</ul>
<h1 id="六、ClickHouse-的-SQL-操作"><a href="#六、ClickHouse-的-SQL-操作" class="headerlink" title="六、ClickHouse 的 SQL 操作"></a>六、ClickHouse 的 SQL 操作</h1><hr>
<p>ClickHouse 支持传统关系型数据库（比如 MySQL）的 SQL 语句，这里记录的是与 SQL 不一致的部分。</p>
<h2 id="6-1-Insert-插入数据"><a href="#6-1-Insert-插入数据" class="headerlink" title="6.1 Insert 插入数据"></a>6.1 Insert 插入数据</h2><p>与标准的 SQL 基本一致<br>语法：</p>
<ul>
<li><code>insert into [table_name] values(...), (...) </code> 往一张表插入多条数据</li>
<li><code>insert into [table_name] select a, b, c from [table_name_2] </code>将一张表的查询结果插入到另一张表</li>
</ul>
<h2 id="6-2-Update-更新-和-Delete-删除"><a href="#6-2-Update-更新-和-Delete-删除" class="headerlink" title="6.2 Update 更新 和 Delete 删除"></a>6.2 Update 更新 和 Delete 删除</h2><p>ClickHouse 将 Update 和 Delete 操作归类为 Mutation 查询，可视为 alter 的一种。<br>虽然可以实现修改和删除，但 Mutation 语句不支持事务，而且每次修改或删除都会导致放弃目标数据的原有分区，重建新的分区。所以尽量做批量的变更，而不进行频繁小数据的操作。</p>
<p>删除语法：<code>alter table [table_name] delete where [...] </code><br>修改语法：<code>alter table [table_name] [...] where [...]</code></p>
<p>Mutation 语句分两步执行，分别是新增分区和标记旧分区、删除旧数据和释放磁盘空间。</p>
<h2 id="6-3-查询操作"><a href="#6-3-查询操作" class="headerlink" title="6.3 查询操作"></a>6.3 查询操作</h2><p>ClickHouse 查询语句和 SQL 类似</p>
<ul>
<li>支持子查询</li>
<li>支持 CTE（Common Table Expression 公用表表达式 with 子句）</li>
<li>支持各种 JOIN 操作，但不能使用缓存，即便是两次相同的 JOIN 语句，ClickHouse也会视为两条新的SQL</li>
<li>不支持自定义函数</li>
<li>窗口函数</li>
<li>GROUP BY 操作 增加了 with rollup\ with cube\ with total 用来计算小计和总计</li>
</ul>
<p>【应用案例】<br>准备数据表和数据</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> t_order_mt(<br>  id UInt32,<br>  sku_id String,<br>  total_amount <span class="hljs-type">Decimal</span>(<span class="hljs-number">16</span>,<span class="hljs-number">2</span>),<br>  create_time Datetime<br>)<br>engine <span class="hljs-operator">=</span> MergeTree() <br><span class="hljs-keyword">PARTITION</span> <span class="hljs-keyword">BY</span> toYYYYMMDD(create_time) <br><span class="hljs-keyword">PRIMARY</span> KEY (id) <br><span class="hljs-keyword">ORDER</span> <span class="hljs-keyword">BY</span>(id, sku_id);<br><br><br><span class="hljs-keyword">alter</span> <span class="hljs-keyword">table</span> t_order_mt <span class="hljs-keyword">delete</span> <span class="hljs-keyword">where</span> <span class="hljs-number">1</span><span class="hljs-operator">=</span><span class="hljs-number">1</span>;<br><br><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> t_order_mt <span class="hljs-keyword">values</span><br>(<span class="hljs-number">101</span>,<span class="hljs-string">&#x27;sku_001&#x27;</span>,<span class="hljs-number">1000.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">101</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">103</span>,<span class="hljs-string">&#x27;sku_004&#x27;</span>,<span class="hljs-number">2500.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">104</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>),<br>(<span class="hljs-number">105</span>,<span class="hljs-string">&#x27;sku_003&#x27;</span>,<span class="hljs-number">600.00</span>,<span class="hljs-string">&#x27;2020-06-02 12:00:00&#x27;</span>),<br>(<span class="hljs-number">106</span>,<span class="hljs-string">&#x27;sku_001&#x27;</span>,<span class="hljs-number">1000.00</span>,<span class="hljs-string">&#x27;2020-06-04 12:00:00&#x27;</span>),<br>(<span class="hljs-number">107</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-04 12:00:00&#x27;</span>),<br>(<span class="hljs-number">108</span>,<span class="hljs-string">&#x27;sku_004&#x27;</span>,<span class="hljs-number">2500.00</span>,<span class="hljs-string">&#x27;2020-06-04 12:00:00&#x27;</span>),<br>(<span class="hljs-number">109</span>,<span class="hljs-string">&#x27;sku_002&#x27;</span>,<span class="hljs-number">2000.00</span>,<span class="hljs-string">&#x27;2020-06-04 12:00:00&#x27;</span>),<br>(<span class="hljs-number">110</span>,<span class="hljs-string">&#x27;sku_003&#x27;</span>,<span class="hljs-number">600.00</span>,<span class="hljs-string">&#x27;2020-06-01 12:00:00&#x27;</span>);<br></code></pre></td></tr></table></figure>

<p>**with rollup **从右往左去掉维度进行小计</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> id , sku_id,<span class="hljs-built_in">sum</span>(total_amount) <span class="hljs-keyword">from</span> t_order_mt <span class="hljs-keyword">group</span> <span class="hljs-keyword">by</span> <br>id,sku_id <span class="hljs-keyword">with</span> <span class="hljs-keyword">rollup</span>;<br></code></pre></td></tr></table></figure>
<p>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/c5fef89951a94d7f949629c54322f9bc.png#">https://img-blog.csdnimg.cn/c5fef89951a94d7f949629c54322f9bc.png#</a> &#x3D;50%x)</p>
<p>**with cube **先从右往左去掉维度进行小计，再从左往右去掉维度进行小计<br>![在这里插入图片描述](<a target="_blank" rel="noopener" href="https://img-blog.csdnimg.cn/5e614c74590f4a7db527cd431e7c912a.png#">https://img-blog.csdnimg.cn/5e614c74590f4a7db527cd431e7c912a.png#</a> &#x3D;50%x)</p>
<p><strong>with totals</strong>：只计算合计</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs sql"><span class="hljs-keyword">select</span> id , sku_id,<span class="hljs-built_in">sum</span>(total_amount) <span class="hljs-keyword">from</span> t_order_mt <span class="hljs-keyword">group</span> <span class="hljs-keyword">by</span> <br>id,sku_id <span class="hljs-keyword">with</span> totals;<br></code></pre></td></tr></table></figure>
<p><img src="https://img-blog.csdnimg.cn/c2bd427b4ae0446b86a47d4bd811da60.png" srcset="/img/loading.gif" lazyload alt="在这里插入图片描述"></p>
<h2 id="6-4-alter-操作"><a href="#6-4-alter-操作" class="headerlink" title="6.4 alter 操作"></a>6.4 alter 操作</h2><p>和 MySQL 修改字段的操作基本一致<br>语法：</p>
<ul>
<li><code>alter table [tableName] add column [newColname] [colType] after [oldCol]</code>添加某一字段（包括类型）到指定列的后面</li>
<li><code>alter table [oldTableName] modify column [newColname] [colType]</code> 修改某一字段的名称以及类型</li>
<li><code>alter table tableName drop column [oldColName]</code>删除字段</li>
</ul>
<h2 id="6-5-导出数据"><a href="#6-5-导出数据" class="headerlink" title="6.5 导出数据"></a>6.5 导出数据</h2><p>参考：<a target="_blank" rel="noopener" href="https://clickhouse.com/docs/zh/interfaces/formats">https://clickhouse.com/docs/zh/interfaces/formats</a><br>示例：</p>
<figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs shell">clickhouse-client --query &quot;select * from t_order_mt&quot; --format CSV &gt; ./data.csv <br></code></pre></td></tr></table></figure>

<h2 id="6-6-副本"><a href="#6-6-副本" class="headerlink" title="6.6 副本"></a>6.6 副本</h2><p>官方文档：<a target="_blank" rel="noopener" href="https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/replication">https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/replication</a><br>副本存在的目的是保障数据的高可用性，在集群环境下，即使一台 ClickHouse节点宕机，那么也可以从其他服务器获得相同的数据。<br>ClickHouse 只有 使用 MergeTree 引擎的表支持副本<br>副本写入流程<br><img src="https://img-blog.csdnimg.cn/img_convert/cc1aec6384c3f97959b4b464f808cfdc.jpeg" srcset="/img/loading.gif" lazyload></p>
<h1 id="七、总结"><a href="#七、总结" class="headerlink" title="七、总结"></a>七、总结</h1><hr>
<p>本篇文章记录了 ClickHouse 的基本概念、特点、数据类型、常见引擎，基本上是参考官方文档和视频资料的，通过这种方式了解了ClickHouse数据库的强大功能。下次将先对其应用进行熟悉，以单机环境为主，先熟悉单机情况下对数据库的操作。</p>
<h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><hr>
<p>[1] <a target="_blank" rel="noopener" href="https://clickhouse.com/docs/zh/guides/">ClickHouse 官方文档</a><br>[2] <a target="_blank" rel="noopener" href="https://www.bilibili.com/video/BV1Yh411z7os">尚硅谷视频教程</a></p>

                
              </div>
            
            <hr/>
            <div>
              <div class="post-metas my-3">
  
    <div class="post-meta mr-3 d-flex align-items-center">
      <i class="iconfont icon-category"></i>
      

<span class="category-chains">
  
  
    
      <span class="category-chain">
        
  <a href="/categories/%E6%95%B0%E6%8D%AE%E5%BA%93/" class="category-chain-item">数据库</a>
  
  

      </span>
    
  
</span>

    </div>
  
  
    <div class="post-meta">
      <i class="iconfont icon-tags"></i>
      
        <a href="/tags/ClickHouse/">#ClickHouse</a>
      
    </div>
  
</div>


              
  

  <div class="license-box my-3">
    <div class="license-title">
      <div>ClickHouse 笔记1 _ 简介、特点 _ 基于CentOS7系统的安装与使用 _ 常用数据类型 _ MergeTree 表引擎 _ SQL操作</div>
      <div>http://example.com/2022/07/26/ClickHouse 笔记1 _ 简介、特点 _ 基于CentOS7系统的安装与使用 _ 常用数据类型 _ MergeTree 表引擎 _ SQL操作/</div>
    </div>
    <div class="license-meta">
      
        <div class="license-meta-item">
          <div>作者</div>
          <div>John Doe</div>
        </div>
      
      
        <div class="license-meta-item license-meta-date">
          <div>发布于</div>
          <div>2022年7月26日</div>
        </div>
      
      
      <div class="license-meta-item">
        <div>许可协议</div>
        <div>
          
            
            
              <a target="_blank" href="https://creativecommons.org/licenses/by/4.0/">
              <span class="hint--top hint--rounded" aria-label="BY - 署名">
                <i class="iconfont icon-by"></i>
              </span>
              </a>
            
          
        </div>
      </div>
    </div>
    <div class="license-icon iconfont"></div>
  </div>



              
                <div class="post-prevnext my-3">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/2022/07/28/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20%E7%AC%94%E8%AE%B09%20_%20%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F%20%E5%9C%A8%E6%BA%90%E7%A0%81%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8%20_%20ArrayList%20%E4%B8%AD%E7%9A%84%E5%8E%9F%E5%9E%8B%E6%A8%A1%E5%BC%8F%20_%20clone%E6%B5%85%E5%85%8B%E9%9A%86%20_%20%E5%9F%BA%E4%BA%8E%E4%BA%8C%E8%BF%9B%E5%88%B6%E6%B5%81%E7%9A%84%E6%B7%B1%E5%85%8B%E9%9A%86%E5%AE%9E%E7%8E%B0/" title="设计模式 笔记9 _ 原型模式 在源码中的应用 _ ArrayList 中的原型模式 _ clone浅克隆 _ 基于二进制流的深克隆实现">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">设计模式 笔记9 _ 原型模式 在源码中的应用 _ ArrayList 中的原型模式 _ clone浅克隆 _ 基于二进制流的深克隆实现</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/2022/07/26/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%20%E7%AC%94%E8%AE%B08%20_%20%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F%20%E5%9C%A8%E6%BA%90%E7%A0%81%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8%20StringBuilder%20%E7%9A%84%20append%20_%20MyBatis%20%E7%9A%84%20SqlSessionFactoryBuilder%20%E5%92%8C%20ConfigBuilder/" title="设计模式 笔记8 _ 建造者模式 在源码中的应用 StringBuilder 的 append _ MyBatis 的 SqlSessionFactoryBuilder 和 ConfigBuilder">
                        <span class="hidden-mobile">设计模式 笔记8 _ 建造者模式 在源码中的应用 StringBuilder 的 append _ MyBatis 的 SqlSessionFactoryBuilder 和 ConfigBuilder</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
          </article>
        </div>
      </div>
    </div>

    <div class="side-col d-none d-lg-block col-lg-2">
      
  <aside class="sidebar" style="margin-left: -1rem">
    <div id="toc">
  <p class="toc-header"><i class="iconfont icon-list"></i>&nbsp;目录</p>
  <div class="toc-body" id="toc-body"></div>
</div>



  </aside>


    </div>
  </div>
</div>





  



  



  



  



  







    

    
      <a id="scroll-top-button" aria-label="TOP" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v" for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>

    

    
  </main>

  <footer>
    <div class="footer-inner">
  
    <div class="footer-content">
       <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>Fluid</span></a> 
    </div>
  
  
  
  
</div>

  </footer>

  <!-- Scripts -->
  
  <script  src="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://lib.baomitu.com/jquery/3.6.0/jquery.min.js" ></script>
<script  src="https://lib.baomitu.com/twitter-bootstrap/4.6.1/js/bootstrap.min.js" ></script>
<script  src="/js/events.js" ></script>
<script  src="/js/plugins.js" ></script>


  <script  src="https://lib.baomitu.com/typed.js/2.0.12/typed.min.js" ></script>
  <script>
    (function (window, document) {
      var typing = Fluid.plugins.typing;
      var subtitle = document.getElementById('subtitle');
      if (!subtitle || !typing) {
        return;
      }
      var text = subtitle.getAttribute('data-typed-text');
      
        typing(text);
      
    })(window, document);
  </script>




  
    <script  src="/js/img-lazyload.js" ></script>
  




  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/tocbot/4.18.2/tocbot.min.js', function() {
    var toc = jQuery('#toc');
    if (toc.length === 0 || !window.tocbot) { return; }
    var boardCtn = jQuery('#board-ctn');
    var boardTop = boardCtn.offset().top;

    window.tocbot.init({
      tocSelector     : '#toc-body',
      contentSelector : '.markdown-body',
      headingSelector : CONFIG.toc.headingSelector || 'h1,h2,h3,h4,h5,h6',
      linkClass       : 'tocbot-link',
      activeLinkClass : 'tocbot-active-link',
      listClass       : 'tocbot-list',
      isCollapsedClass: 'tocbot-is-collapsed',
      collapsibleClass: 'tocbot-is-collapsible',
      collapseDepth   : CONFIG.toc.collapseDepth || 0,
      scrollSmooth    : true,
      headingsOffset  : -boardTop
    });
    if (toc.find('.toc-list-item').length > 0) {
      toc.css('visibility', 'visible');
    }
  });
</script>


  <script src=https://lib.baomitu.com/clipboard.js/2.0.10/clipboard.min.js></script>

  <script>Fluid.plugins.codeWidget();</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/anchor-js/4.3.1/anchor.min.js', function() {
    window.anchors.options = {
      placement: CONFIG.anchorjs.placement,
      visible  : CONFIG.anchorjs.visible
    };
    if (CONFIG.anchorjs.icon) {
      window.anchors.options.icon = CONFIG.anchorjs.icon;
    }
    var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
    var res = [];
    for (var item of el) {
      res.push('.markdown-body > ' + item.trim());
    }
    if (CONFIG.anchorjs.placement === 'left') {
      window.anchors.options.class = 'anchorjs-link-left';
    }
    window.anchors.add(res.join(', '));
  });
</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.js', function() {
    Fluid.plugins.fancyBox();
  });
</script>


  <script>Fluid.plugins.imageCaption();</script>

  <script  src="/js/local-search.js" ></script>





<!-- 主题的启动项，将它保持在最底部 -->
<!-- the boot of the theme, keep it at the bottom -->
<script  src="/js/boot.js" ></script>


  

  <noscript>
    <div class="noscript-warning">博客在允许 JavaScript 运行的环境下浏览效果更佳</div>
  </noscript>
</body>
</html>
